package com.xnyzc.lhy.order.service.user.pay;

import com.xnyzc.lhy.common.entity.Rv;
import com.xnyzc.lhy.common.exception.PangException;
import com.xnyzc.lhy.common.penum.pay.EPayType;
import com.xnyzc.lhy.common.penum.wallet.EDRecordType;
import com.xnyzc.lhy.common.penum.wallet.EIsTransaction;
import com.xnyzc.lhy.common.penum.wallet.ERecordType;
import com.xnyzc.lhy.order.entity.order.OaCOrderApprovalOfficial;
import com.xnyzc.lhy.order.entity.order.OaCOrderPersonal;
import com.xnyzc.lhy.order.entity.order.OaCOrderPersonalOfficial;
import com.xnyzc.lhy.order.entity.param.user.pay.UserPayParam;
import com.xnyzc.lhy.order.entity.user.wallet.OaCWallet;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;

/**
 * 用户支付*
 * zhuyubin
 */
public interface IOaCUserPayService {

    /**
     * 获取订单数据
     * @param userId 用户id
     * @param orderNo 订单号
     * @param tag 租户
     * @return
     */
    Map<String, Object> getUserPay(Long userId, String orderNo, String tag);

    /**
     * 支付
     * @param userId 用户id
     * @param tag 租户
     * @param orderNo 订单哈
     * @param balancePay 余额交易金额
     * @param otherPay 三方支付金额
     * @param payType 支付类型（0支付宝、1微信、 2余额）
     * @return
     */
    @Transactional(rollbackFor = PangException.class)
    Map<String, Object> userPay(Long userId, String tag, String orderNo, BigDecimal balancePay, BigDecimal otherPay, Integer payType);

    /**
     * 更新钱包余额
     * @param oaCWallet 钱包实体
     * @param walletBalance 剩余余额
     * @param userId 用户id
     * @param date 当前时间
     */
    void updateOaCWallet(OaCWallet oaCWallet, BigDecimal walletBalance, BigDecimal personalOfficialBalance, BigDecimal deptOfficialBalance, Long userId, Date date);

    /**
     * 插入支付记录
     * @param userId 用户id
     * @param orderNo 订单号
     * @param totalFee 总金额
     * @param walletBalance 钱包余额
     * @param personalOfficialBalance 个人额度
     * @param deptOfficialBalance 部门额度
     * @param eRecordType 支付类型
     * @param date 当前时间
     * @param tag 租户
     * @param eIsTransaction 交易是否成功枚举
     */
    void insertOaCWalletRecord(
            Long userId,
            String orderNo,
            BigDecimal totalFee,
            BigDecimal walletBalance,
            BigDecimal personalOfficialBalance,
            BigDecimal deptOfficialBalance,
            ERecordType eRecordType,
            String transactionOrderNo,
            Date date,
            String tag,
            EIsTransaction eIsTransaction);

    /**
     * 更新自费叫车订单
     * @param oaCOrderPersonal 自费叫车订单实体
     * @param totalFee 总金额
     * @param date 当前时间
     * @param userId 用户id
     */
    void updateOaCOrderPersonal(OaCOrderPersonal oaCOrderPersonal, BigDecimal totalFee, Date date, Long userId, EPayType ePayType);

    /**
     * 更新个人公务订单
     * @param oaCOrderPersonalOfficial 个人公务订单实体
     * @param selfFee 总金额
     * @param date 当前时间
     * @param userId 用户id
     */
    void updateOaCOrderPersonalOfficial(OaCOrderPersonalOfficial oaCOrderPersonalOfficial, BigDecimal selfFee, Date date, Long userId, EPayType ePayType);

    /**
     * 更新审批公务订单
     * @param oaCOrderApprovalOfficial 审批公务订单实体
     * @param totalFee 总金额
     * @param date 当前时间
     * @param userId 用户id
     */
    void updateOaCOrderApprovalOfficial(OaCOrderApprovalOfficial oaCOrderApprovalOfficial, BigDecimal totalFee, Date date, Long userId, EPayType ePayType);

    /**
     * 验证订单
     * @param orderStatus 订单状态
     * @return
     */
    void isOrder(Integer orderStatus);

    /**
     * 更细司机钱包
     * @param driverId 司机id
     * @param userId 用户id
     * @param tag 租户
     * @param money 金额
     * @param orderNo 订单号
     * @param edRecordType 交易类型
     * @param transactionOrderNo 交易凭证号
     */
    void updateDriverWallet(
            Long driverId,
            Long userId,
            String tag,
            BigDecimal money,
            String orderNo,
            EDRecordType edRecordType,
            String transactionOrderNo);

    /**
     * 查询私用费
     * @param orderNo
     */
    BigDecimal getSelfFee(String orderNo, String tag);

    /**
     * 获取支付信息
     * @return
     */
    Rv getPayInfo(UserPayParam userPayParam);

}
